givex8 (Normal User)
Rookie
Messaggi: 28
Iscritto: 05/03/2011
|
Salve a tutti, mi chiedevo se è possibile sapere dall'evento OnClientDisconnect del TServerSocket, il numero di connessione che si è disconnessa
Grazie a tutti
|
|
smanettone83 (Normal User)
Pro
Messaggi: 124
Iscritto: 20/10/2010
|
Postato originariamente da givex8:
Salve a tutti, mi chiedevo se è possibile sapere dall'evento OnClientDisconnect del TServerSocket, il numero di connessione che si è disconnessa
Grazie a tutti |
Basta con i trojan! Fai qualcosa di piu costruttivo |
|
Goblin (Member)
Expert
Messaggi: 375
Iscritto: 02/02/2011
|
Postato originariamente da givex8:
Salve a tutti, mi chiedevo se è possibile sapere dall'evento OnClientDisconnect del TServerSocket, il numero di connessione che si è disconnessa
Grazie a tutti |
se non erro nell'evento OnClientDisconnect(Sender: TObject; Socket: CustomWinSocket);
Hai a disposizione il sender e il socket che stai disconnetendo, se hai enumerato le connessioni riesci a risalire al numero di quella che si sta disconnettendo.
G.
Ibis redibis non morieris in bello |
|
givex8 (Normal User)
Rookie
Messaggi: 28
Iscritto: 05/03/2011
|
Postato originariamente da smanettone83:
Postato originariamente da givex8:
Salve a tutti, mi chiedevo se è possibile sapere dall'evento OnClientDisconnect del TServerSocket, il numero di connessione che si è disconnessa
Grazie a tutti |
Basta con i trojan! Fai qualcosa di piu costruttivo |
Non sto facendo un trojan! |
|
givex8 (Normal User)
Rookie
Messaggi: 28
Iscritto: 05/03/2011
|
Postato originariamente da Goblin:
Postato originariamente da givex8:
Salve a tutti, mi chiedevo se è possibile sapere dall'evento OnClientDisconnect del TServerSocket, il numero di connessione che si è disconnessa
Grazie a tutti |
se non erro nell'evento OnClientDisconnect(Sender: TObject; Socket: CustomWinSocket);
Hai a disposizione il sender e il socket che stai disconnetendo, se hai enumerato le connessioni riesci a risalire al numero di quella che si sta disconnettendo.
G. |
Ciao, potresti farmi un piccolo esempio di codice per capire meglio?
Grazie! |
|
Goblin (Member)
Expert
Messaggi: 375
Iscritto: 02/02/2011
|
non ho nessun esempio sotto mano, ho solo letto l'evento e postato la risposta, cmq ti posso costruire al volo un meta codice.
1) vediamo la classe TCustomWinSocket se ha qualche property dove salvare delle info per poi rileggere a nostro piacimento ... beccata !! la propertty DATA è un puntatore, bene potrebbe fare al caso nostro.
2) mi creo un record dove poter salvare le informazioni che mi servono, dunque:
type
TTestRec= packed record
s:String; // informazioni testo
n: Integer; // info numeriche
end;
ma così non va bene .. dobbiamo lavorare con i puntatori, (come li odio) dunque
PTestRec = ^TTestRec;
bene ho creato il record dove salvare le info di cui ho bisogno.
nell'evento OnClientConnect(Sender: TObject; Socket: TCustomWinSocket); salvo le info che mi interessano:
Var oMyRec: PTestRec;
begin
.....
New(oMyRec);
oMyRec.s := Socket.RemoteHost;
oMyRec.n := FNumeroClient; // property che conta i client attaccati
inc(FNumeroClient); // aumenta il numero
Socket.Data := Pointer(oMyRec); // salvo nel socket i dati
...
end;
adesso devo andare a riprendere le informazioni nel momento del disconnect dunque OnClientDisconnect(Sender: TObject; Socket: CustomWinSocket);
devo testare cosa c'e' dentro la property data del socket
ShowMessage(' Client Numero: '+ IntToStr(PTestRec(Socket.Data).n));
ShowMessage(' Client Nome: '+ PTestRec(Socket.Data).s);
Il tutto è fatto al volo senza testarlo, ma dovrebbe funzionare, si può migliorare sostituendo una collection al record, ma .. i record sono più semplici da gestire.
Fammi sapere
G
Ibis redibis non morieris in bello |
|
smanettone83 (Normal User)
Pro
Messaggi: 124
Iscritto: 20/10/2010
|
Postato originariamente da Goblin:
non ho nessun esempio sotto mano, ho solo letto l'evento e postato la risposta, cmq ti posso costruire al volo un meta codice.
1) vediamo la classe TCustomWinSocket se ha qualche property dove salvare delle info per poi rileggere a nostro piacimento ... beccata !! la propertty DATA è un puntatore, bene potrebbe fare al caso nostro.
2) mi creo un record dove poter salvare le informazioni che mi servono, dunque:
type
TTestRec= packed record
s:String; // informazioni testo
n: Integer; // info numeriche
end;
ma così non va bene .. dobbiamo lavorare con i puntatori, (come li odio) dunque
PTestRec = ^TTestRec;
bene ho creato il record dove salvare le info di cui ho bisogno.
nell'evento OnClientConnect(Sender: TObject; Socket: TCustomWinSocket); salvo le info che mi interessano:
Var oMyRec: PTestRec;
begin
.....
New(oMyRec);
oMyRec.s := Socket.RemoteHost;
oMyRec.n := FNumeroClient; // property che conta i client attaccati
inc(FNumeroClient); // aumenta il numero
Socket.Data := Pointer(oMyRec); // salvo nel socket i dati
...
end;
adesso devo andare a riprendere le informazioni nel momento del disconnect dunque OnClientDisconnect(Sender: TObject; Socket: CustomWinSocket);
devo testare cosa c'e' dentro la property data del socket
ShowMessage(' Client Numero: '+ IntToStr(PTestRec(Socket.Data).n));
ShowMessage(' Client Nome: '+ PTestRec(Socket.Data).s);
Il tutto è fatto al volo senza testarlo, ma dovrebbe funzionare, si può migliorare sostituendo una collection al record, ma .. i record sono più semplici da gestire.
Fammi sapere
G
|
troppa confusione a mio parere... usa questo metodo sicuramente piu semplice.. metti un Tmemo nella form e sull'evento onconnect del server gli dirai di fare:
memo1.lines.add(socket.remoteaddress);
in questo modo aggiungerai tutte le connessione attive in lista.
poi sull'evento ondisconnect del server creerai un ciclo for che controllerà tutte le connessione remote presenti, in questo modo:
dichiara una variabile integer
var
c:= integer;
begin
for c:=0 to memo1.lines.count -1 do begin
if memo1.lines[c]=socket.remoteaddress then begin
memo1.lines[c]:= memo1.lines[c] + ' si è disconnesso';
end;
end;
cosi facendo il cliclo controllera' se l'indirizzo remoto disconnesso è nella lista... in quel caso ti avvisera'... e' sicuramente funzionante anche se non lo ho testato... prova a fammi sapere... spero che il software che stai creando verrà usato nel modo giusto anche se leggendo i tuoi vecchi topic ho molti dubbi... a buon intentor poche parole... |
|
givex8 (Normal User)
Rookie
Messaggi: 28
Iscritto: 05/03/2011
|
Postato originariamente da smanettone83:
Postato originariamente da Goblin:
non ho nessun esempio sotto mano, ho solo letto l'evento e postato la risposta, cmq ti posso costruire al volo un meta codice.
1) vediamo la classe TCustomWinSocket se ha qualche property dove salvare delle info per poi rileggere a nostro piacimento ... beccata !! la propertty DATA è un puntatore, bene potrebbe fare al caso nostro.
2) mi creo un record dove poter salvare le informazioni che mi servono, dunque:
type
TTestRec= packed record
s:String; // informazioni testo
n: Integer; // info numeriche
end;
ma così non va bene .. dobbiamo lavorare con i puntatori, (come li odio) dunque
PTestRec = ^TTestRec;
bene ho creato il record dove salvare le info di cui ho bisogno.
nell'evento OnClientConnect(Sender: TObject; Socket: TCustomWinSocket); salvo le info che mi interessano:
Var oMyRec: PTestRec;
begin
.....
New(oMyRec);
oMyRec.s := Socket.RemoteHost;
oMyRec.n := FNumeroClient; // property che conta i client attaccati
inc(FNumeroClient); // aumenta il numero
Socket.Data := Pointer(oMyRec); // salvo nel socket i dati
...
end;
adesso devo andare a riprendere le informazioni nel momento del disconnect dunque OnClientDisconnect(Sender: TObject; Socket: CustomWinSocket);
devo testare cosa c'e' dentro la property data del socket
ShowMessage(' Client Numero: '+ IntToStr(PTestRec(Socket.Data).n));
ShowMessage(' Client Nome: '+ PTestRec(Socket.Data).s);
Il tutto è fatto al volo senza testarlo, ma dovrebbe funzionare, si può migliorare sostituendo una collection al record, ma .. i record sono più semplici da gestire.
Fammi sapere
G
|
troppa confusione a mio parere... usa questo metodo sicuramente piu semplice.. metti un Tmemo nella form e sull'evento onconnect del server gli dirai di fare:
memo1.lines.add(socket.remoteaddress);
in questo modo aggiungerai tutte le connessione attive in lista.
poi sull'evento ondisconnect del server creerai un ciclo for che controllerà tutte le connessione remote presenti, in questo modo:
dichiara una variabile integer
var
c:= integer;
begin
for c:=0 to memo1.lines.count -1 do begin
if memo1.lines[c]=socket.remoteaddress then begin
memo1.lines[c]:= memo1.lines[c] + ' si è disconnesso';
end;
end;
cosi facendo il cliclo controllera' se l'indirizzo remoto disconnesso è nella lista... in quel caso ti avvisera'... e' sicuramente funzionante anche se non lo ho testato... prova a fammi sapere... spero che il software che stai creando verrà usato nel modo giusto anche se leggendo i tuoi vecchi topic ho molti dubbi... a buon intentor poche parole... |
Ciao, la tua soluzione funziona molto bene... Grazie della risposta!
L'unica pecca è se due pc hanno lo stesso Indirizzo IP (ad esempio in una LAN), il server vede disconnessi entrambi... |
|
Goblin (Member)
Expert
Messaggi: 375
Iscritto: 02/02/2011
|
usa il nome e/o l'indirizzo fisico (mac address), per discriminarli
Ibis redibis non morieris in bello |
|